package com.example.smartagrisys.service;

import com.example.smartagrisys.dto.InventoryDTO;
import com.example.smartagrisys.vo.InventoryVO;

import java.math.BigDecimal;
import java.util.List;

/**
 * 通用库存服务接口
 */
public interface InventoryService {
    
    /**
     * 获取农户的所有库存
     * @param farmerId 农户ID
     * @return 库存列表
     */
    List<InventoryVO> getInventoryByFarmerId(Long farmerId);
    
    /**
     * 获取农户某类型的库存
     * @param farmerId 农户ID
     * @param type 库存类型
     * @return 库存列表
     */
    List<InventoryVO> getInventoryByType(Long farmerId, String type);
    
    /**
     * 获取农户低于预警阈值的库存
     * @param farmerId 农户ID
     * @return 库存列表
     */
    List<InventoryVO> getLowInventory(Long farmerId);
    
    /**
     * 添加库存
     * @param farmerId 农户ID
     * @param dto 库存数据
     * @return 添加的库存ID
     */
    Long addInventory(Long farmerId, InventoryDTO dto);
    
    /**
     * 更新库存
     * @param farmerId 农户ID
     * @param id 库存ID
     * @param dto 库存数据
     * @return 是否成功
     */
    boolean updateInventory(Long farmerId, Long id, InventoryDTO dto);
    
    /**
     * 删除库存
     * @param farmerId 农户ID
     * @param id 库存ID
     * @return 是否成功
     */
    boolean deleteInventory(Long farmerId, Long id);
    
    /**
     * 获取单个库存详情
     * @param id 库存ID
     * @return 库存详情
     */
    InventoryVO getInventoryById(Long id);
    
    /**
     * 检查并更新库存（用于农事活动中消耗物品）
     * @param farmerId 农户ID
     * @param type 物品类型
     * @param itemId 关联物品ID（可选）
     * @param name 物品名称（可选，与itemId二选一）
     * @param quantity 使用数量
     * @return 是否成功
     */
    boolean checkAndUpdateInventory(Long farmerId, String type, Long itemId, String name, BigDecimal quantity);
    
    /**
     * 直接减少指定ID的库存数量
     * @param inventoryId 库存ID
     * @param farmerId 农户ID
     * @param quantity 减少的数量
     * @return 是否成功
     */
    boolean reduceInventoryDirectly(Long inventoryId, Long farmerId, BigDecimal quantity);
} 